iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
Security

【Google資安證書課程重點整理】系列 第 28

【Google資安證書重點整理】Day 28_Python常用的指令二

  • 分享至 

  • xImage
  •  

導讀

https://ithelp.ithome.com.tw/upload/images/20240929/20026585g7rKuRKhej.png

我們將進一步探討如何將 Python 應用於安全分析,特別是自動化處理大型的安全日誌。

重點內容:

1. 開啟與讀取檔案

  • 介紹如何使用 Python 開啟和讀取檔案,特別是處理安全日誌檔案中的數據。

2. 文件解析

  • 學習如何解析日誌檔案,提取出有關系統活動和安全性的關鍵資訊。

3. 程式碼調試

  • 認識常見的 Python 錯誤訊息,並了解如何調試程式碼,確保程式能正常運作。

自動化的基本 Python 元件

1. 使用 Python 自動化任務

  • 自動化 是透過技術減少重複性任務的手動操作,特別是在安全分析中,Python 是自動化的重要工具。
  • 您將使用 Python 來自動調查登入、管理存取及更新裝置等任務。

2. 必要的 Python 元件

(1) 變數

  • 變數 是儲存資料的容器,在自動化任務中非常重要,能避免重複編寫值。

(2) 條件語句

  • 條件語句 讓您可以檢查特定條件是否滿足後再執行操作,提升效率。

(3) 迭代語句

  • 迭代語句 讓您能自動執行重複的指令。包括:
    • for 迴圈:根據序列自動重複程式碼。
    • while 迴圈:根據條件自動重複程式碼。

(4) 函數

  • 函數 是可重複使用的程式碼片段,幫助自動化任務,您可以定義自己的函數或使用 Python 的內建函數。

3. 處理字串與清單的技術

(1) 字串

  • 字串 是常見的資料類型,您可以透過索引存取其字元,或使用函數如 str()len().index() 等。

(2) 清單

  • 清單 是另一常見的資料類型,您可以透過索引存取元素,也可使用 .insert().remove().append().index() 等方法來自動處理清單。

4. 自動化範例:計算標記用戶的登入次數

  • 使用以下 Python 元件自動化用戶登入次數的調查:
    1. for 迴圈:迭代清單中的每個使用者名稱。
    2. 條件語句:檢查是否與標記使用者名稱相符。
    3. 計數器變數:記錄出現的次數。
    4. 函數:將邏輯封裝成函數,可重複使用,傳回標記用戶的登入次數。

5. 在 Python 中處理文件

  • 處理日誌檔案 是網路安全自動化中的關鍵部分,通常以 .txt.csv 格式儲存。
  • 您將學習如何匯入、讀取、寫入檔案,並從中提取安全相關資訊。

將檔案導入 Python

1. 處理網路安全中的文件

  • 安全分析師 經常需要使用 Python 存取各種檔案,尤其是日誌檔案。
  • 日誌 是系統內部事件的記錄,常用來識別異常行為,如惡意登入嘗試或應用程式攻擊等。

2. 如何在 Python 中開啟檔案

  • 使用 open() 函數來開啟檔案,語法為:
    with open("update_log.txt", "r") as file:
    
  • with 關鍵字 :用來管理外部資源,確保檔案在使用完畢後自動關閉。
  • open() 函數:用來開啟檔案,第一個參數是檔案名稱,第二個參數是操作模式(如 "r" 表示讀取模式)。
  • as 關鍵字:將開啟的檔案指派給變數,如 file,以供後續操作使用。

絕對與相對路徑

若檔案位於相同目錄中,可直接指定檔案名稱。

with open("update_log.txt", "r") as file:

若檔案位於不同目錄,則需使用 絕對路徑:

with open("/home/analyst/logs/access_log.txt", "r") as file:

3. 在 Python 中讀取文件

使用 .read() 方法將檔案的內容轉換為字串:

with open("update_log.txt", "r") as file:
    updates = file.read()
    print(updates)
  • .read() 方法:讀取檔案並返回字串形式的內容,儲存在變數中以供後續操作。

處理字串

  • 對讀取後的字串內容,可以使用 Python 的字串處理方法,如 .index()、len() 來進行操作。

在 Python 中寫入文件

  • 使用 open() 函數的 "w" 或 "a" 模式來寫入文件:

  • "w" 模式:覆蓋或建立新檔案。

with open("update_log.txt", "w") as file:
    file.write("新內容")
  • "a" 模式:附加內容到現有檔案末端。
with open("update_log.txt", "a") as file:
    file.write("附加的內容")
  • .write() 方法:將字串資料寫入檔案。

寫入範例

  • 例子:將新資料追加到 access_log.txt 中:
line = "jrafael,192.168.243.140,4:56:27,True"
with open("access_log.txt", "a") as file:
    file.write(line)

5. 重點總結

  • 匯入檔案 是 Python 自動化的重要部分,特別是在安全分析中。
  • 需要熟悉以下元素:
    • with 關鍵字確保檔案資源管理。
    • open() 函數用來開啟檔案,使用 "r" 讀取、 "w" 寫入、 "a" 附加。
    • .read() 和 .write() 方法分別用於讀取與寫入檔案內容。

在 Python 中處理文件

您之前探索了如何在 Python 中開啟檔案,並如何讀取和寫入檔案。您也學習了如何透過 .split() 方法來調整文件內容的結構。本文回顧 .split() 方法,並介紹另一個可以幫助您處理文件內容的附加方法:.join()

1. 解析文件內容

解析是將數據轉換為更可讀格式的過程,這對於程式設計師及 Python 程式本身的處理都很重要。處理文件內容的關鍵方法包括:

  • .split():將字串轉換為列表。
  • .join():將列表轉換為字串。

2. .split() 的基礎知識

  • 功能:將字串轉換為列表,根據指定的分隔符進行切割。
  • 語法string.split(separator),其中 separator 是可選的,若未提供則默認以空格分隔。

範例:

approved_users = "elarson,bmoreno,tshah,sgilmore,eraab"
print("before .split():", approved_users)
approved_users = approved_users.split(",")
print("after .split():", approved_users)

結果:
.split() 之前:'elarson,bmoreno,tshah,sgilmore,eraab'
.split() 之後:['elarson', 'bmoreno', 'tshah', 'sgilmore', 'eraab']

沒有指定分隔符的 .split():

若未指定分隔符,則 .split() 會在每個空格處自動切割字串。

removed_users = "wjaffrey jsoto abernard jhill awilliam"
removed_users = removed_users.split()
print(removed_users)

結果:
['wjaffrey', 'jsoto', 'abernard', 'jhill', 'awilliam']

3. .split() 應用於文件

當文件內容被 .read() 方法讀取成字串後,可以使用 .split() 將其轉換為列表,便於後續處理,如迭代操作。

範例:

with open("update_log.txt", "r") as file:
    updates = file.read()
updates = updates.split()

4. .join() 的基礎知識

功能:將列表元素連接成字串,並使用指定的字符作為分隔符。
語法:separator.join(list),其中 separator 是用來分隔元素的字符。
範例:

approved_users = ['elarson', 'bmoreno', 'tshah', 'sgilmore', 'eraab']
approved_users = ",".join(approved_users)
print(approved_users)

結果:
.join() 之前:['elarson', 'bmoreno', 'tshah', 'sgilmore', 'eraab']
.join() 之後:'elarson,bmoreno,tshah,sgilmore,eraab'
使用 \n 進行換行分隔:
可以使用 \n 字符將列表中的元素換行:

"\n".join(approved_users)

.join() 應用於文件

當需要將列表內容寫入文件時,應先使用 .join() 方法將列表轉換回字串,然後使用 .write() 方法將其寫入文件。
範例:

updates = "jrafael,192.168.243.140,4:56:27,True".split()
with open("access_log.txt", "w") as file:
    file.write(" ".join(updates))
    

6. 重點總結

.split() 方法 將字串轉換為列表,方便進行迭代或處理。
.join() 方法 將列表轉換為字串,方便將其寫入文件。
在處理文件時,這兩個方法是將文件內容在字串與列表之間轉換的關鍵工具。

python 用在自動化的邏輯概念

  • 將所有部分組合在一起,以導入文件、解析它,並實作一個簡單的演算法來偵測可疑的登入嘗試。
  • 建立一個程式,每當有新用戶登入時,檢查其是否已嘗試登入三次或以上失敗。

輸入結構與計劃

  • 使用 .txt 格式的日誌文件,每行包含一個使用者名稱,代表一次失敗的登入嘗試。
  • 程式需檢查用戶名在日誌檔案中出現的次數,若出現三次或更多則返回警報。

程式碼實作步驟

  • 匯入日誌檔案

    • 使用 open() 函數讀取日誌檔案,並將其內容儲存到 usernames 變數中。
  • 計算用戶名出現次數

    • 遍歷 usernames 列表的前八個元素,使用 for 迴圈和計數器變數計算每個用戶名的出現次數。
    • 透過 if 語句比較用戶名並更新計數器。
  • 定義函數

    • 定義 login_check() 函數,接受 login_listcurrent_user 兩個參數。
    • 函數內部使用 for 迴圈遍歷 login_list,並透過 if 語句檢查 current_user 的出現次數,更新計數器。
  • 警報與登入

    • 使用 if-else 語句來列印警報,若計數器顯示三次或更多失敗登入嘗試則顯示「帳戶已鎖定」,否則允許登入。

測試與結果

  • 使用範例用戶名測試函數,確認函數是否能正確識別可疑的登入嘗試。
  • 確認用戶「eraab」在前八個名字中有兩次失敗登入嘗試,結果顯示「帳戶已鎖定」,符合預期。

常見的程式撰寫錯誤

修正複雜的錯誤程式碼,有時比編寫程式碼本身花費更多時間。發展處理錯誤的技能非常重要,關鍵在於調試程式碼,這是識別並修復錯誤的過程。

錯誤的三種類型

1. 語法錯誤

  • 描述:語法錯誤涉及無效的 Python 語言用法,例如函數定義後遺漏冒號。
  • 特徵:錯誤訊息通常提供錯誤的位置,修正相對容易。
  • 範例
    • 遺漏函數後的括號
    • 拼字錯誤
    • 未關閉字串引號

2. 邏輯錯誤

  • 描述:邏輯錯誤不會產生錯誤訊息,但會導致程式產生意想不到的結果。
  • 解決策略
    • 使用 print() 語句來追蹤程式碼執行,找出問題區域。
    • 使用偵錯器來設置斷點,分段測試程式碼。
  • 範例
    • 在列印語句中錯誤地使用 < 代替 <=

3. 異常 (Exceptions)

  • 描述:當程式碼執行過程中遇到無法處理的情況時發生。例如除以零或存取不存在的索引值。
  • 解決策略
    • 使用 try-except 區塊來處理潛在的異常。
    • 使用 print() 語句或偵錯器來定位錯誤源。
  • 範例
    • 除以零
    • 使用不正確的資料類型
    • 存取超出範圍的列表索引

範例

字串索引超出範圍:

  • 範例情境:字串 my_string 包含 "security",如果嘗試存取不存在的索引會導致錯誤。
  • 錯誤訊息"字串索引超出範圍"
my_string = "security"
print(my_string[10])  # 會產生 "字串索引超出範圍" 的錯誤

探索調試技術

在這篇文章中,我們將深入探討偵錯 Python 程式碼的策略,並附加範例來更好地理解這些概念。

錯誤類型

在 Python 開發過程中,遇到錯誤是正常現象。了解錯誤的三種類型可以幫助您更有效地修復錯誤。

1. 語法錯誤

  • 描述:語法錯誤指的是無效的 Python 語法,例如漏掉括號或函數定義後忘記冒號。
  • 特徵:當您執行有語法錯誤的程式碼時,錯誤訊息會提供錯誤位置及其描述,通常以「SyntaxError:」開頭。
  • 範例
    message = "You are debugging a syntax error
    print(message)
    
    這段程式碼會產生 SyntaxError: EOL while scanning string literal,因為字串結尾缺少引號。

2. 邏輯錯誤

描述:邏輯錯誤是程式碼的邏輯運算錯誤,可能不會產生錯誤訊息,但會導致不正確的結果。
解決策略:
使用 print() 追蹤程式執行流程。
使用偵錯器設置斷點,逐步測試程式碼。
範例:

login_attempts = 5
if login_attempts >= 5:
    print("User has not reached maximum number of login attempts.")
else:
    print("User has reached maximum number of login attempts.")

由於條件錯誤,輸出不符預期:「使用者未達到最大登入嘗試次數」。

3. 異常 (Exceptions)

描述:異常指的是程式執行過程中遇到無法處理的錯誤情況,例如變數未定義或除以零。
常見異常:
NameError:變數未定義。
IndexError:索引超出範圍。
TypeError:錯誤的資料類型操作。
FileNotFoundError:找不到指定檔案。
範例:

print("Unusual logins:", unusual_logins)
這會產生 NameError: name 'unusual_logins' is not defined,因為未為 unusual_logins 變數指派值。

偵錯策略

  1. 偵錯工具
    使用整合開發環境 (IDE) 中的偵錯工具,它可以幫助定位錯誤並設置斷點來測試程式碼特定部分。
  2. 使用列印語句
    另一種偵錯策略是加入臨時的 print() 語句來追蹤程式執行狀態。這可以幫助找出邏輯錯誤。
    範例:
new_users = ["sgilmore", "bmoreno"]
approved_users = ["bmoreno", "tshah", "elarson"]

def add_users():
    for user in new_users:
        print("line 5 - inside for loop")
        if user in approved_users:
            print("line 7 - inside if statement")
            print(user, "already in list")
        print("line 9 - before .append method")
        approved_users.append(user)

add_users()
print(approved_users)

此範例中,加入了列印語句來檢查程式執行過程,發現 .append() 不應該被調用兩次,因此需要調整邏輯。


上一篇
【Google資安證書重點整理】Day 27_Python常用的指令二
下一篇
【Google資安證書重點整理】Day 29_為網路安全工作做好準備
系列文
【Google資安證書課程重點整理】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言